package com.sheng.leetcode.year2023.month10.day10;

import org.junit.Test;

import java.util.Arrays;

/**
 * @author by ls
 * @date 2023/10/10
 * <p>
 * 2731. 移动机器人<p>
 * <p>
 * 有一些机器人分布在一条无限长的数轴上，他们初始坐标用一个下标从 0 开始的整数数组 nums 表示。当你给机器人下达命令时，它们以每秒钟一单位的速度开始移动。
 * 给你一个字符串 s ，每个字符按顺序分别表示每个机器人移动的方向。'L' 表示机器人往左或者数轴的负方向移动，'R' 表示机器人往右或者数轴的正方向移动。
 * 当两个机器人相撞时，它们开始沿着原本相反的方向移动。
 * 请你返回指令重复执行 d 秒后，所有机器人之间两两距离之和。由于答案可能很大，请你将答案对 10^9 + 7 取余后返回。<p>
 * 注意：<p>
 * 对于坐标在 i 和 j 的两个机器人，(i,j) 和 (j,i) 视为相同的坐标对。也就是说，机器人视为无差别的。
 * 当机器人相撞时，它们 立即改变 它们的前进方向，这个过程不消耗任何时间。
 * 当两个机器人在同一时刻占据相同的位置时，就会相撞。
 * 例如，如果一个机器人位于位置 0 并往右移动，另一个机器人位于位置 2 并往左移动，
 * 下一秒，它们都将占据位置 1，并改变方向。再下一秒钟后，第一个机器人位于位置 0 并往左移动，
 * 而另一个机器人位于位置 2 并往右移动。
 * 例如，如果一个机器人位于位置 0 并往右移动，另一个机器人位于位置 1 并往左移动，
 * 下一秒，第一个机器人位于位置 0 并往左行驶，而另一个机器人位于位置 1 并往右移动。<p>
 * <p>
 * 示例 1：<p>
 * 输入：nums = [-2,0,2], s = "RLL", d = 3<p>
 * 输出：8<p>
 * 解释：<p>
 * 1 秒后，机器人的位置为 [-1,-1,1] 。现在下标为 0 的机器人开始往左移动，下标为 1 的机器人开始往右移动。<p>
 * 2 秒后，机器人的位置为 [-2,0,0] 。现在下标为 1 的机器人开始往左移动，下标为 2 的机器人开始往右移动。<p>
 * 3 秒后，机器人的位置为 [-3,-1,1] 。<p>
 * 下标为 0 和 1 的机器人之间距离为 abs(-3 - (-1)) = 2 。<p>
 * 下标为 0 和 2 的机器人之间的距离为 abs(-3 - 1) = 4 。<p>
 * 下标为 1 和 2 的机器人之间的距离为 abs(-1 - 1) = 2 。<p>
 * 所有机器人对之间的总距离为 2 + 4 + 2 = 8 。<p>
 * <p>
 * 示例 2：<p>
 * 输入：nums = [1,0], s = "RL", d = 2<p>
 * 输出：5<p>
 * 解释：<p>
 * 1 秒后，机器人的位置为 [2,-1] 。<p>
 * 2 秒后，机器人的位置为 [3,-2] 。<p>
 * 两个机器人的距离为 abs(-2 - 3) = 5 。<p>
 * <p>
 * 提示：<p>
 * 2 <= nums.length <= 10^5<p>
 * -2 * 10^9 <= nums[i] <= 2 * 10^9<p>
 * 0 <= d <= 10^9<p>
 * nums.length == s.length<p>
 * s 只包含 'L' 和 'R' 。<p>
 * nums[i] 互不相同。<p>
 */
public class LeetCode2731 {

    @Test
    public void test01() {
//        int[] nums = {-2, 0, 2};
//        String s = "RLL";
//        int d = 3;
        int[] nums = {1, 0};
        String s = "RL";
        int d = 2;
        System.out.println(new Solution().sumDistance(nums, s, d));
    }
}

class Solution {

    final int M = 1000000007;

    public int sumDistance(int[] nums, String s, int d) {
        // 机器人碰撞之后两个都往相反的方向行走，相当于没有改变方向
        int n = nums.length;
        long[] longs = new long[n];
        for (int i = 0; i < n; i++) {
            longs[i] = nums[i] + (s.charAt(i) == 'L' ? -d : d);
        }
        Arrays.sort(longs);
        long ans = 0, sum = 0;
        for (int i = 0; i < n; i++) {
            ans = (ans + i * longs[i] - sum) % M;
            sum += longs[i];
        }
        return (int) ans;
    }
}
